home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / gfx / show / svoUtah22.lha / svoUtahRLE / source / SV_WriteSubs.c < prev    next >
C/C++ Source or Header  |  1995-04-14  |  4KB  |  138 lines

  1.  
  2.  /* SV_WriteSubs.c
  3.     - Functions for Writing of UtahRLE Files -
  4.     (c) 1990-95 by Andreas R. Kleinert
  5.     Last changes : 14.04.1995
  6.  */
  7.  
  8. #include "svobject.h"
  9.  
  10.  
  11. ULONG __saveds __asm SVO_Write( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
  12.  
  13. ULONG __saveds __stdargs SVLI_PackRLE(struct rle_hdr *RLEHeader, UBYTE *dptr, ULONG width, ULONG height);
  14.  
  15.  
  16. /* *************************************************** */
  17. /* *                             * */
  18. /* * SVO_Write : ...                                 * */
  19. /* *                             * */
  20. /* *************************************************** */
  21.  
  22. ULONG __saveds __asm SVO_Write( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
  23. {
  24.  struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
  25.  
  26.  ULONG retval = SVERR_NO_ERROR;
  27.  ULONG  width, height;
  28.  
  29.  struct rle_hdr __aligned RLEHeader;
  30.  
  31.  
  32.  if(!SVObjectHandle)                              return(SVERR_NO_HANDLE);
  33.  if(SVObjectHandle->ah_Medium != AKO_MEDIUM_DISK) return(SVERR_ACTION_NOT_SUPPORTED);
  34.  
  35.  if(!SVObjectHandle->ah_SV_GfxBuffer2)
  36.   {
  37.    if(SVObjectHandle->ah_WriteScreen)
  38.     {
  39.      retval = SVSUP_ScreenToOnePlane8(SVObjectHandle->ah_WriteScreen, &SVObjectHandle->ah_SV_GfxBuffer2);
  40.      if(retval) return(retval);
  41.  
  42.      if(!SVObjectHandle->ah_SV_GfxBuffer2) return(SVERR_NO_MEMORY);
  43.  
  44.      /* to free the memory : */
  45.  
  46.      SVObjectHandle->ah_SV_GfxBuffer = SVObjectHandle->ah_SV_GfxBuffer2;
  47.  
  48.     }else return(SVERR_ACTION_NOT_SUPPORTED);
  49.   }else
  50.   {
  51.    if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType == SVGFX_BUFFERTYPE_BITPLANE)
  52.     {
  53.      retval = SVSUP_BitPlaneToOnePlane8(SVObjectHandle->ah_SV_GfxBuffer2, &SVObjectHandle->ah_SV_GfxBuffer);
  54.      if(retval) return(retval);
  55.  
  56.      if(!SVObjectHandle->ah_SV_GfxBuffer) return(SVERR_NO_MEMORY);
  57.  
  58.      /* now set it to make use of it : */
  59.  
  60.      SVObjectHandle->ah_SV_GfxBuffer2 = SVObjectHandle->ah_SV_GfxBuffer;
  61.     }
  62.   }
  63.  
  64.  width  = (UWORD) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Width;
  65.  height = (UWORD) SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Height;
  66.  
  67.  if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_BufferType != SVGFX_BUFFERTYPE_ONEPLANE) return(SVERR_ACTION_NOT_SUPPORTED);
  68.  if(SVObjectHandle->ah_SV_GfxBuffer2->svgfx_ColorDepth != 24)                        return(SVERR_ACTION_NOT_SUPPORTED);
  69.  
  70.  SVObjectHandle->ah_FILE_dest = fopen(SVObjectHandle->ah_WriteName, "wb");
  71.  if(!SVObjectHandle->ah_FILE_dest) return(SVERR_NO_FILE);
  72.  
  73.  RLEHeader.rle_file = SVObjectHandle->ah_FILE_dest;
  74.  
  75.  RLEHeader.ncolors    = 3; /* 24 Bit           */
  76.  RLEHeader.alpha      = N; /* no alpha channel */
  77.  
  78.  RLEHeader.ncmap      = N; /* no ColorMap      */
  79.  RLEHeader.cmap       = N;
  80.  RLEHeader.cmaplen    = N;
  81.  
  82.  RLE_SET_BIT(RLEHeader, 0); /* R */
  83.  RLE_SET_BIT(RLEHeader, 1); /* G */
  84.  RLE_SET_BIT(RLEHeader, 2); /* B */
  85.  
  86.  RLEHeader.xmin       = 0;
  87.  RLEHeader.xmax       = width - 1;
  88.  RLEHeader.ymin       = 0;
  89.  RLEHeader.ymax       = height - 1;
  90.  
  91.  RLEHeader.background = 2;
  92.  
  93.  rle_put_setup(&RLEHeader);
  94.  
  95.  retval = SVLI_PackRLE(&RLEHeader, SVObjectHandle->ah_SV_GfxBuffer2->svgfx_Buffer, width, height);
  96.  
  97.  return(retval);
  98. }
  99.  
  100. ULONG __saveds __stdargs SVLI_PackRLE(struct rle_hdr *RLEHeader, UBYTE *dptr, ULONG width, ULONG height)
  101. {
  102.  ULONG j, w3, w3_2;
  103.  UBYTE *start, *r_row, *g_row, *b_row, *row_vec[3];
  104.  
  105.  w3   = width * 3;
  106.  w3_2 = w3 << 1;
  107.  
  108.  start = AllocVec(w3, MEMF_CLEAR|MEMF_PUBLIC);
  109.  if(!start) return(SVERR_NO_MEMORY);
  110.  
  111.  row_vec[2] = (row_vec[1] = (row_vec[0] = start) + width) + width;
  112.  
  113.  dptr += (w3 * height);
  114.  dptr -= w3;
  115.  
  116.  while(height--)
  117.   {
  118.    r_row = row_vec[0];
  119.    g_row = row_vec[1];
  120.    b_row = row_vec[2];
  121.  
  122.    for(j=0; j<width; j++)
  123.     {
  124.      *r_row++ = *dptr++;
  125.      *g_row++ = *dptr++;
  126.      *b_row++ = *dptr++;
  127.     }
  128.  
  129.    rle_putrow(&row_vec[0], width, RLEHeader);
  130.  
  131.    dptr -= w3_2;
  132.   }
  133.  
  134.  FreeVec(start);
  135.  
  136.  return(SVERR_NO_ERROR);
  137. }
  138.